package com.atde._03_creational_design_patterns.singleton.type05;


/**
 * @className: SingletonTest05
 * @author: Del
 * @date: 2025/5/27 18:11
 * @Version: 1.0
 * @description: 单例模式写法5 -- 懒汉式（线程安全的，同步代码块）
 */   
public class SingletonTest05 {
    public static void main(String[] args) {

    }
}

/**
 * 懒汉式（线程安全的，同步代码块）
 * 1）这种方式，本意是想对第四种实现方式的改进，因为前面同步方法效率太低，改为同步产生实例化的代码块
 * 2）但是这种同步并不能起到线程同步的作用，跟第3种实现方式遇到的情形一致，假如一个线程进入了 if (singleton == null) 判断语句块，还未来得及往下执行
 * 另一个线程也通过了这个判断语句，这时便会产生多个实例
 * 3） 结论：在实际开发中，不能使用这种方式
 */
class Singleton {
    private static Singleton instance;

    // 1. 构造器私有化
    private Singleton(){}

    // 2. 提供一个静态的公有方法，当使用到该方法时，才去创建 instance
    // 即懒汉式，且加 synchronized 同步代码块，但是并未完全解决线程安全问题
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
             instance = new Singleton();
            }
        }
        return instance;
    }
}
